# pylint: disable=unused-argument
# pylint: disable=redefined-outer-name
# pylint: disable=line-too-long

import pytest

from helpers.cluster import ClickHouseCluster

cluster = ClickHouseCluster(__file__)

node = cluster.add_instance(
    "node",
    main_configs=["configs/config.d/overrides.xml"],
    tmpfs=["/disk1:size=100M", "/disk2:size=100M"],
)


@pytest.fixture(scope="module")
def start_cluster():
    try:
        cluster.start()
        node.query(
            "CREATE DATABASE IF NOT EXISTS test ENGINE=Ordinary",
            settings={"allow_deprecated_database_ordinary": 1},
        )  # Different paths with Atomic
        yield cluster
    finally:
        cluster.shutdown()


def _files_in_dist_mon(node, root, table):
    return int(
        node.exec_in_container(
            [
                "bash",
                "-c",
                # `-maxdepth 1` to avoid /tmp/ subdirectory
                "find /{root}/data/test/{table}/default@127%2E0%2E0%2E2:9000 -maxdepth 1 -type f 2>/dev/null | wc -l".format(
                    root=root, table=table
                ),
            ]
        ).split("\n")[0]
    )


def test_insert(start_cluster):
    node.query("CREATE TABLE test.foo (key Int) Engine=Memory()")
    node.query(
        """
    CREATE TABLE test.dist_foo (key Int)
    Engine=Distributed(
        test_cluster_two_shards,
        test,
        foo,
        key%2,
        'jbod_policy'
    )
    """
    )
    # manual only (but only for remote node)
    node.query("SYSTEM STOP DISTRIBUTED SENDS test.dist_foo")

    node.query(
        "INSERT INTO test.dist_foo SELECT * FROM numbers(100)",
        settings={
            "use_compact_format_in_distributed_parts_names": "0",
        },
    )
    assert _files_in_dist_mon(node, "disk1", "dist_foo") == 1
    assert _files_in_dist_mon(node, "disk2", "dist_foo") == 0

    assert node.query("SELECT count() FROM test.dist_foo") == "100\n"
    node.query("SYSTEM FLUSH DISTRIBUTED test.dist_foo")
    assert node.query("SELECT count() FROM test.dist_foo") == "200\n"

    #
    # RENAME
    #
    node.query("RENAME TABLE test.dist_foo TO test.dist2_foo")

    node.query(
        "INSERT INTO test.dist2_foo SELECT * FROM numbers(100)",
        settings={
            "use_compact_format_in_distributed_parts_names": "0",
        },
    )
    assert _files_in_dist_mon(node, "disk1", "dist2_foo") == 0
    assert _files_in_dist_mon(node, "disk2", "dist2_foo") == 1

    assert node.query("SELECT count() FROM test.dist2_foo") == "300\n"
    node.query("SYSTEM FLUSH DISTRIBUTED test.dist2_foo")
    assert node.query("SELECT count() FROM test.dist2_foo") == "400\n"

    #
    # DROP
    #
    node.query("DROP TABLE test.dist2_foo")
    for disk in ["disk1", "disk2"]:
        node.exec_in_container(
            ["bash", "-c", "test ! -e /{}/data/test/dist2_foo".format(disk)]
        )
